This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.
This version of beta calculation is used for the theoretical method/results of the paper. For reference: the last update was Dec 2018 for an R notebook. This R notebook is an updated and more sophisticated version.
Constants used are listed at the start of this script.
setwd("D:/R program")
The working directory was changed to D:/R program inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
source("inspack.R")

#values needed
K= 1.38064852*(10)^-23 #m2 kg/ s2 K boltzmann constant
mu= 1.126*(10)^-3 #kg/m s dynamic viscosity in 18C
v= 1.099*(10)^-6 #m2/s kinematic viscosity in 18C
Reh_calc= 2.3E-6 #in m radius Ehux
Reh_naked= 1.8E-6 #in m radius Ehux
Reh_lith = 1.3E-6 #in m radius
Rehv= 90*(10)^-9 #in m radius virus
Temp = 18+273.15 #temp in kelvin, here assuming 18C
Den_OcM = 1.05 #g/cm3 density organic cell matter
Den_CH2O= 1.025 #g/cm3 density seawater at 18C
CcNum <- 0.9*((10)^3)
NcNum <- 0.1*((10)^3)
ViNum <- (CcNum+NcNum)*10
LiNum <- CcNum*10
Calculating for Brownian motion
#Brownian motion (BM)
#1. make a data frame
BM <- data.frame (group=as.factor(c("Nc", "Cc", "Cc", "Li", "Li")), group2 =c("Nc", "Cc-Mc", "Cc-Hc", "Li-Mc", "Li-Hc"), rad= c(Reh_naked, Reh_calc, Reh_calc, Reh_lith, Reh_lith))
#2. calculate beta (beta)
BM$beta_BM <- ((2*(K*(10)^4)*Temp*(((BM$rad+Rehv)*100)^2))/((3*mu*10)*(BM$rad*Rehv*1e4)))*86400 #cm3/d
# go back to this later
#3. calculate encounters (E)
#BM$E_BM <- BM$beta_BM*ViNum
BM
Differential settling
#Differential settling (DS)
#1. read in PIC data
library(readr) #always use readr not baseR
setwd("D:/R program")
The working directory was changed to D:/R program inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
PIC <- read_csv("Postdoc-R/CSV Files/PIC.csv")
Parsed with column specification:
cols(
Strain = [31mcol_character()[39m,
Replicate = [32mcol_double()[39m,
TC = [32mcol_double()[39m,
AC = [32mcol_double()[39m,
Cellcount = [32mcol_double()[39m
)
PIC$Strain <- as.factor(PIC$Strain)
PIC$Replicate <- as.factor(PIC$Replicate)
#2. calculate PIC for cell
PIC$PIC <- PIC$TC-PIC$AC
PIC$PICpercell <- (PIC$PIC/PIC$Cellcount)*(10)^-3#in g
PIC$PICpercellpg <- PIC$PICpercell*1e12
ggplotly(ggplot(data=PIC, aes(x=Strain, y=PICpercellpg)) + geom_boxplot()+geom_point(size=2) +theme_Publication())
#3a. calculate density of cells (den_cell)
PIC <- mutate(PIC, group = ifelse(PICpercellpg < 4 , "Nc", "Cc"))
ggplotly(ggplot(data=PIC, aes(x=group, y=PICpercellpg)) + geom_boxplot()+geom_point(size=2, aes(color=Strain))+ theme_Publication())
plotly.js does not (yet) support horizontal legend items
You can track progress here:
https://github.com/plotly/plotly.js/issues/53
PIC <- mutate(PIC, rad = ifelse(group == "Nc" , 1.8E-6, 2.3E-6)) #in m
PIC$volume <- (4/3)*pi*(PIC$rad*100)^3 #in cm3
PIC$Den_cell <- PIC$PICpercell/PIC$volume #g/cm3
PIC$Den_celltotal <- PIC$Den_cell+Den_OcM
#remove strains 621, 623, 625
PIC <- PIC %>% filter (! Strain %in% c("621", "623", "655"))
ggplotly(ggplot(data=PIC, aes(x=Strain, y=Den_celltotal, color=group)) + geom_boxplot()+geom_point(size=2)
+theme_Publication())
plotly.js does not (yet) support horizontal legend items
You can track progress here:
https://github.com/plotly/plotly.js/issues/53
#some strains that are "naked" have PIC<2. I chose to ignore this since in the lm model I do not use
#strain as a factor, rather data is treated as a whole (e.g., no grouping)
#assume grouping
PIC$group2 <- case_when(
PIC$PICpercellpg <2 ~ "Nc",
PIC$PICpercellpg >2 & PIC$PICpercellpg < 4 ~ "Nc/Cc uncertain",
PIC$PICpercellpg >4 & PIC$PICpercellpg < 10 ~ "Cc-Mc",
PIC$PICpercellpg >10 ~ "Cc-Hc",
TRUE ~ as.character(PIC$PICpercellpg)
)
PIC$group2 <- factor (PIC$group2,levels= c("Nc", "Nc/Cc uncertain", "Cc-Mc", "Cc-Hc"),
labels = c("Nc", "Nc/Cc uncertain", "Cc-Mc", "Cc-Hc"))
#remove Nc/Cc uncertain
PIC <- PIC %>% filter (! group2 %in% c("Nc/Cc uncertain"))
#3b. calculate PIC and density for lith
PIC$perlith <- PIC$PICpercell/14 #in g, assuming 20 liths attached
PIC$perlithpg <- PIC$perlith*1e12 #in pg
PIC$Denlith <- case_when(
PIC$group2 == "Nc" ~ 1.025,
PIC$group2 == "Cc-Mc" ~ 2,
PIC$group2 == "Cc-Hc" ~ 2.6)
ggplotly(ggplot(data=PIC, aes(x=group, y=Denlith, color=group)) + geom_boxplot()+geom_point(size=2)
+theme_Publication())
plotly.js does not (yet) support horizontal legend items
You can track progress here:
https://github.com/plotly/plotly.js/issues/53
#4. calculate sinking velocity of cells,liths, and viruses
PIC$SinkVel <- ((2*((PIC$rad*100)^2)*(981)*(PIC$Den_celltotal-Den_CH2O))/(9*(mu*10)))*864 #meter per day
PIC$SinkVel_lith <- ((2*((Reh_lith*100)^2)*(981)*(PIC$Denlith-Den_CH2O))/(9*(mu*10)))*864 #meter per day
Ehv_SinkVel <- ((2*((Rehv*100)^2)*(981)*(Den_CH2O-Den_CH2O))/(9*(mu*10)))*864 #equals to 0
#g is converted to per day, 864 is the one that converts cm/s to m/day
#plot sinking velocity vs calcification
ggplot(data=PIC, aes(x=PICpercellpg, y=SinkVel, color=Strain, shape=group2)) + geom_point(size=5)+theme_Publication()+
labs(y = expression("Sinking velocity"~("m"~day^-1)), x = expression("PIC pg"~cell^-1)) +
theme(legend.direction = "horizontal", legend.box = "vertical", legend.title = element_blank())

ggplot(data=PIC %>% filter (group=="Cc"), aes(x=perlithpg, y=SinkVel_lith, color=group2, shape=group2)) +
geom_point(size=5)+theme_Publication()+
labs(y = expression("Sinking velocity"~("m"~day^-1)), x = expression("PIC pg"~lith^-1)) +
theme(legend.direction = "horizontal", legend.box = "vertical", legend.title = element_blank())

#5. calculate betas for DS
PIC$beta_DS <-(pi*(((PIC$rad+Rehv)*100)^2)*(abs((PIC$SinkVel-Ehv_SinkVel)/864)))*86400 #in encounters cm3/day
PIC$beta_DS_lith <- (pi*(((Reh_lith+Rehv)*100)^2)*(abs((PIC$SinkVel_lith-Ehv_SinkVel)/864)))*86400 #in encounters cm3/day
ggplot(data=PIC, aes(x=PICpercellpg, y=beta_DS, color=Strain, shape=group2)) + geom_point(size=5)+theme_Publication()+
labs(y = expression(beta~("Encounters"~cm^3~day^-1)), x = expression("PIC pg"~cell^-1)) +
scale_y_log10(
breaks = scales::trans_breaks("log10", function(x) 10^x, n=2),
labels = scales::trans_format("log10", scales::math_format(10^.x))) + annotation_logticks(sides="l")+
theme(legend.direction = "horizontal", legend.box = "vertical", legend.title = element_blank())

ggplot(data=PIC %>% filter (group=="Cc"), aes(x=perlithpg, y=beta_DS_lith, color=group2, shape=group2)) + geom_point(size=5)+theme_Publication()+
labs(y = expression(beta~("Encounters"~cm^3~day^-1)), x = expression("PIC pg"~lith^-1)) +
scale_y_log10(
breaks = scales::trans_breaks("log10", function(x) 10^x, n=2),
labels = scales::trans_format("log10", scales::math_format(10^.x))) + annotation_logticks(sides="l")+
theme(legend.direction = "horizontal", legend.box = "vertical", legend.title = element_blank())

#6. calculate encounters
PIC$E_DS <- (PIC$beta_DS*ViNum) #E calculated with Virus for cell
PIC$E_DS_lith <- (PIC$beta_DS_lith*ViNum) #E calculated with Virus for lith
ggplotly(ggplot(data=PIC, aes(x=PICpercellpg, y=log10(E_DS))) +geom_point(size=5, aes(shape=group2, color=Strain)) +
theme_Publication() + geom_smooth())
`geom_smooth()` using method = 'loess' and formula 'y ~ x'
plotly.js does not (yet) support horizontal legend items
You can track progress here:
https://github.com/plotly/plotly.js/issues/53
ggplot(data=PIC, aes(x=PICpercellpg, y=E_DS, color=Strain, shape=group2)) + geom_point(size=5)+theme_Publication()+
scale_y_log10(
breaks = scales::trans_breaks("log10", function(x) 10^x, n=2),
labels = scales::trans_format("log10", scales::math_format(10^.x))) + annotation_logticks(sides="l") +
theme(legend.direction = "horizontal", legend.box = "vertical", legend.title = element_blank()) +
labs(y = expression("viral encounters " ~ day^-1~cell^-1), x = expression("PIC pg"~cell^-1))

ggplot(data=PIC %>% filter (group =="Cc"), aes(x=perlithpg, y=E_DS_lith, color=Strain, shape=group2)) + geom_point(size=5)+theme_Publication()+
scale_y_log10(
breaks = scales::trans_breaks("log10", function(x) 10^x, n=2),
labels = scales::trans_format("log10", scales::math_format(10^.x))) + annotation_logticks(sides="l") +
theme(legend.direction = "horizontal", legend.box = "vertical", legend.title = element_blank()) +
labs(y = expression("viral encounters " ~ day^-1~cell^-1), x = expression("PIC pg"~lith^-1))

#7. summaries
library(plyr)
summary_DS <- ddply(PIC, .(Strain), summarize, PICpercellpg=mean(PICpercellpg), perlithpg = mean(perlithpg),
Den_celltotal = mean (Den_celltotal),SinkVel=mean(SinkVel),beta_DS=mean(beta_DS), E_DS= mean(E_DS),
Denlith = mean (Denlith), SinkVel_lith=mean (SinkVel_lith),
beta_DS_lith=mean (beta_DS_lith), E_DS_lith=mean (E_DS_lith))
summary_DS_bygroup2 <- ddply(PIC, .(group2), summarize, PICpercellpg=mean(PICpercellpg), perlithpg = mean(perlithpg),
Den_celltotal = mean (Den_celltotal), SinkVel=mean(SinkVel),beta_DS=mean(beta_DS), E_DS= mean(E_DS),
Denlith = mean (Denlith), SinkVel_lith=mean (SinkVel_lith),
beta_DS_lith=mean (beta_DS_lith), E_DS_lith=mean (E_DS_lith))
summary_DS_bygroup <- ddply(PIC, .(group),
summarize, PICpercellpg=mean(PICpercellpg), perlithpg = mean(perlithpg),
Den_celltotal = mean (Den_celltotal), SinkVel=mean(SinkVel),beta_DS=mean(beta_DS), E_DS= mean(E_DS),
Denlith = mean (Denlith), SinkVel_lith=mean (SinkVel_lith),
beta_DS_lith=mean (beta_DS_lith), E_DS_lith=mean (E_DS_lith))
summary_DS
summary_DS_bygroup2
summary_DS_bygroup
setwd("D:/R program")
The working directory was changed to D:/R program inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
require(openxlsx)
write.xlsx(summary_DS, file = "Postdoc-R/Exported Tables/summary_DS_master4.xlsx")
write.xlsx(summary_DS_bygroup, file = "Postdoc-R/Exported Tables/summary_DS_bygroup_master4.xlsx")
write.xlsx(summary_DS_bygroup2, file = "Postdoc-R/Exported Tables/summary_DS_bygroup2_master4.xlsx")
#8. regressions
#8a. PIC and beta_DS of cells
PIC_beta_reg <- lm (beta_DS ~ PICpercellpg, data=PIC)
summary(PIC_beta_reg)
Call:
lm(formula = beta_DS ~ PICpercellpg, data = PIC)
Residuals:
Min 1Q Median 3Q Max
-1.322e-07 -7.329e-08 -2.830e-08 8.065e-08 1.657e-07
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.496e-07 2.295e-08 6.52 3.29e-07 ***
PICpercellpg 3.285e-07 2.529e-09 129.90 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 9.621e-08 on 30 degrees of freedom
Multiple R-squared: 0.9982, Adjusted R-squared: 0.9982
F-statistic: 1.688e+04 on 1 and 30 DF, p-value: < 2.2e-16
plot(residuals.lm(PIC_beta_reg))

coef(PIC_beta_reg)
(Intercept) PICpercellpg
1.496035e-07 3.284952e-07
cor(PIC$PICpercellpg, PIC$beta_DS)
[1] 0.9991123
#8d other regressions, change this
PIC_Den_celltotal_reg <- lm(Den_celltotal ~ PICpercellpg, data=PIC)
PIC_SinkVel_reg <- lm (SinkVel ~ PICpercellpg, data=PIC)
plot(residuals.lm(PIC_Den_celltotal_reg))

plot(residuals.lm(PIC_SinkVel_reg))

#9. make a prediction based on PIC values
#9a. for cells
require(truncnorm)
require(Rmisc)
summary(PIC$PICpercellpg)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-0.4144 0.5770 3.2591 6.0910 9.2665 20.1442
summarySE(data=PIC, measurevar="PICpercellpg")
#make new dataframe
PIC_newdata <- as.data.frame(rtruncnorm(n=10000, a=-0.4, b=20.14, mean=6.09, sd=6.83))
#rename column. rename function in plyr
library(plyr)
PIC_newdata <- plyr::rename (PIC_newdata, c ("rtruncnorm(n = 10000, a = -0.4, b = 20.14, mean = 6.09, sd = 6.83)" = "PICpercellpg"))
PIC_newdata <- mutate(PIC_newdata, group = ifelse(PICpercellpg < 4 , "Nc", "Cc"))
ggplotly(ggplot(data=PIC_newdata, aes(x=group, y=PICpercellpg)) + geom_boxplot()+geom_point(size=2) +
theme_Publication())
PIC_newdata$group2 <- case_when(
PIC_newdata$PICpercellpg <2 ~ "Nc",
PIC_newdata$PICpercellpg >2 & PIC_newdata$PICpercellpg < 4 ~ "Nc/Cc uncertain",
PIC_newdata$PICpercellpg >4 & PIC_newdata$PICpercellpg < 10 ~ "Cc-Mc",
PIC_newdata$PICpercellpg >10 ~ "Cc-Hc",
TRUE ~ as.character(PIC_newdata$PICpercellpg)
)
PIC_newdata$group2 <- factor (PIC_newdata$group2,levels= c("Nc", "Nc/Cc uncertain", "Cc-Mc", "Cc-Hc"), labels = c("Nc", "Nc/Cc uncertain", "Cc-Mc", "Cc-Hc"))
#remove Nc/Cc uncertain
PIC_newdata <- PIC_newdata %>% filter (! group2 %in% c("Nc/Cc uncertain"))
#calculate new stuff
PIC_newdata <- mutate(PIC_newdata, rad = ifelse(group == "Nc" , 1.8E-6, 2.3E-6)) #in m
PIC_newdata$volume <- (4/3)*pi*(PIC_newdata$rad*100)^3 #in cm3
PIC_newdata$Den_cell <- (PIC_newdata$PICpercell*1e-12)/PIC_newdata$volume #g/cm3
PIC_newdata$Den_celltotal <- PIC_newdata$Den_cell+Den_OcM
ggplotly(ggplot(data=PIC, aes(x=Strain, y=Den_celltotal, color=group)) + geom_boxplot()+geom_point(size=2)
+theme_Publication())
plotly.js does not (yet) support horizontal legend items
You can track progress here:
https://github.com/plotly/plotly.js/issues/53
#3b. calculate PIC and density for lith
PIC_newdata$perlithpg <- PIC_newdata$PICpercellpg/14 #in g, assuming 20 liths attached
PIC_newdata$Denlith <- case_when(
PIC_newdata$group2 == "Nc" ~ 1.025,
PIC_newdata$group2 == "Nc/Cc uncertain" ~ 1.025,
PIC_newdata$group2 == "Cc-Mc" ~ 2,
PIC_newdata$group2 == "Cc-Hc" ~ 2.6)
ggplotly(ggplot(data=PIC_newdata, aes(x=group, y=Denlith, color=group)) + geom_boxplot()+geom_point(size=2)
+theme_Publication())
plotly.js does not (yet) support horizontal legend items
You can track progress here:
https://github.com/plotly/plotly.js/issues/53
#4. calculate sinking velocity of cells,liths, and viruses
PIC_newdata$SinkVel <- ((2*((PIC_newdata$rad*100)^2)*(981)*(PIC_newdata$Den_celltotal-Den_CH2O))/(9*(mu*10)))*864 #meter per day
PIC_newdata$SinkVel_lith <- ((2*((Reh_lith*100)^2)*(981)*(PIC_newdata$Denlith-Den_CH2O))/(9*(mu*10)))*864 #meter per day
Ehv_SinkVel <- ((2*((Rehv*100)^2)*(981)*(Den_CH2O-Den_CH2O))/(9*(mu*10)))*864 #equals to 0
#g is converted to per day, 864 is the one that converts cm/s to m/day
#plot sinking velocity vs calcification
ggplot(data=PIC_newdata, aes(x=PICpercellpg, y=SinkVel, color=group2, shape=group2)) + geom_point(size=5)+theme_Publication()+
labs(y = expression("Sinking velocity"~("m"~day^-1)), x = expression("PIC pg"~cell^-1)) +
theme(legend.direction = "horizontal", legend.box = "vertical", legend.title = element_blank())

ggplot(data=PIC_newdata %>% filter (group=="Cc"), aes(x=perlithpg, y=SinkVel_lith, color=group2, shape=group2)) +
geom_point(size=5)+theme_Publication()+
labs(y = expression("Sinking velocity"~("m"~day^-1)), x = expression("PIC pg"~lith^-1)) +
theme(legend.direction = "horizontal", legend.box = "vertical", legend.title = element_blank())

#5. calculate betas for DS
PIC_newdata$beta_DS <-(pi*(((PIC_newdata$rad+Rehv)*100)^2)*(abs((PIC_newdata$SinkVel-Ehv_SinkVel)/864)))*86400 #in encounters cm3/day
PIC_newdata$beta_DS_lith <- (pi*(((Reh_lith+Rehv)*100)^2)*(abs((PIC_newdata$SinkVel_lith-Ehv_SinkVel)/864)))*86400 #in encounters cm3/day
ggplot(data=PIC_newdata %>% filter (!(group2 %in% c("Nc/Cc uncertain"))), aes(x=PICpercellpg , y=beta_DS, color=group2, shape=group2)) + geom_point(size=5)+theme_Publication()+
labs(y = expression(beta~("Encounters"~cm^3~day^-1)), x = expression("PIC pg"~cell^-1)) +
scale_y_log10(
breaks = scales::trans_breaks("log10", function(x) 10^x, n=2),
labels = scales::trans_format("log10", scales::math_format(10^.x))) + annotation_logticks(sides="l")+
theme(legend.direction = "horizontal", legend.box = "vertical", legend.title = element_blank())

ggplot(data=PIC_newdata %>% filter (group=="Cc"), aes(x=perlithpg, y=beta_DS_lith, color=group2, shape=group2)) + geom_point(size=5)+theme_Publication()+
labs(y = expression(beta~("Encounters"~cm^3~day^-1)), x = expression("PIC pg"~lith^-1)) +
scale_y_log10(
breaks = scales::trans_breaks("log10", function(x) 10^x, n=2),
labels = scales::trans_format("log10", scales::math_format(10^.x))) + annotation_logticks(sides="l")+
theme(legend.direction = "horizontal", legend.box = "vertical", legend.title = element_blank())

#6. calculate encounters
PIC_newdata$E_DS <- (PIC_newdata$beta_DS*ViNum) #E calculated with Virus for cell
PIC_newdata$E_DS_lith <- (PIC_newdata$beta_DS_lith*ViNum) #E calculated with Virus for lith
ggplotly(ggplot(data=PIC_newdata, aes(x=PICpercellpg, y=log10(E_DS))) +geom_point(size=5, aes(shape=group2, color=group2)) +
theme_Publication() + geom_smooth())
`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
plotly.js does not (yet) support horizontal legend items
You can track progress here:
https://github.com/plotly/plotly.js/issues/53
#remove strains 621, 623, 625
ggplot(data=PIC_newdata , aes(x=PICpercellpg, y=E_DS, color=group2, shape=group2)) + geom_point(size=5)+theme_Publication()+
scale_y_log10(
breaks = scales::trans_breaks("log10", function(x) 10^x, n=2),
labels = scales::trans_format("log10", scales::math_format(10^.x))) + annotation_logticks(sides="l") +
theme(legend.direction = "horizontal", legend.box = "vertical", legend.title = element_blank()) +
labs(y = expression("viral encounters " ~ day^-1~cell^-1), x = expression("PIC pg"~cell^-1))

ggplot(data=PIC_newdata %>% filter (group =="Cc"), aes(x=perlithpg, y=E_DS_lith, color=group2, shape=group2)) + geom_point(size=5)+theme_Publication()+
scale_y_log10(
breaks = scales::trans_breaks("log10", function(x) 10^x, n=2),
labels = scales::trans_format("log10", scales::math_format(10^.x))) + annotation_logticks(sides="l") +
theme(legend.direction = "horizontal", legend.box = "vertical", legend.title = element_blank()) +
labs(y = expression("viral encounters " ~ day^-1~cell^-1), x = expression("PIC pg"~lith^-1))

#10. calculate encounters based on newdata
summary_DS_bygroup<-ddply(PIC %>% filter (!(group2 %in% c("naked/calcified uncertain"))), .(group), summarize, PICpercellpg=mean(PICpercellpg),
perlithpg = mean(perlithpg), Den_celltotal = mean (Den_celltotal),
SinkVel=mean(SinkVel),beta_DS=mean(beta_DS), E_DS= mean(E_DS),
Denlith = mean (Denlith), SinkVel_lith=mean (SinkVel_lith),
beta_DS_lith=mean (beta_DS_lith), E_DS_lith=mean (E_DS_lith))
summary_DS_bygroup
#remove naked/calcified uncertain
summary_DS_bygroup_pred <-ddply(PIC_newdata, .(group), summarize, PICpercellpg=mean(PICpercellpg),
perlithpg = mean(perlithpg), Den_celltotal = mean (Den_celltotal),
SinkVel=mean(SinkVel),beta_DS=mean(beta_DS), E_DS= mean(E_DS),
Denlith = mean (Denlith), SinkVel_lith=mean (SinkVel_lith),
beta_DS_lith=mean (beta_DS_lith), E_DS_lith=mean (E_DS_lith))
summary_DS_bygroup_pred
summary_DS_bygroup2_pred <-ddply(PIC_newdata, .(group2), summarize, PICpercellpg=mean(PICpercellpg),
perlithpg = mean(perlithpg), Den_celltotal = mean (Den_celltotal),
SinkVel=mean(SinkVel),beta_DS=mean(beta_DS), E_DS= mean(E_DS),
Denlith = mean (Denlith), SinkVel_lith=mean (SinkVel_lith),
beta_DS_lith=mean (beta_DS_lith), E_DS_lith=mean (E_DS_lith))
summary_DS_bygroup2_pred
summarySE (PIC_newdata %>% filter (!(group2 %in% c("naked/calcified uncertain"))),
measurevar = "PICpercellpg", groupvars = c("group"))
setwd("D:/R program")
The working directory was changed to D:/R program inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
write.xlsx(summary_DS_bygroup_pred, file = "Postdoc-R/Exported Tables/summary_DS_bygroup_pred_master4.xlsx")
#arrange the summary
DS_pred <- data.frame (group=as.factor(c("Nc", "Cc", "Cc", "Li", "Li")), group2 =c("Nc", "Cc-Mc", "Cc-Hc", "Li-Mc", "Li-Hc"), PIC = c(0.8767253, 6.9482471, 13.6411818, 0.49630336, 0.97437013), Den = c(1.085889, 1.186334, 1.317658, 2, 2.6), SinkVel = c(0.03299996,0.14276197, 0.25896889, 0.2756279, 0.4452451), beta_DS = c(3.703283e-07, 2.561877e-06, 4.647220e-06, 1.673026e-06, 2.702580e-06))
DS_pred
Turbulence

melt all data and make a table with all
all <- Reduce(function(x,y) merge(x,y,by="group2",all=TRUE) ,
list(BM %>% select (group2, beta_BM), DS_pred %>% select (group2, beta_DS),
turb %>% select (group2, disrate, beta_turb)))
all$beta_all <- all$beta_BM + all$beta_DS + all$beta_turb
all$E_all_low <- all$beta_all*(10^4)
all$E_all_high <- all$beta_all*(10^6)
all$group <- factor (all$group,levels= c("Nc", "Cc-Mc", "Cc-Hc", "Li-Mc", "Li-Hc"), labels = c("Nc", "Cc", "Cc", "Li", "Li"))
#make summary so that you can have CI
#plotting
ggplot(data=all, aes(x=disrate,y = E_all_low, color=group, fill=group)) +
geom_smooth(size=1, position=position_jitter(w=0.02, h=0), aes(linetype="10^3", fill=group))+
geom_smooth(data = all, aes(y= E_all_high, color=group,fill=group, linetype="10^5")) +
scale_y_log10(
breaks = scales::trans_breaks("log10", function(x) 10^x, n=2),
labels = scales::trans_format("log10", scales::math_format(10^.x))) +
scale_x_log10(
breaks = scales::trans_breaks("log10", function(x) 10^x, n=7),
labels = scales::trans_format("log10", scales::math_format(10^.x))) +
annotation_logticks()+
theme_Publication() +
theme(legend.title = element_blank(), legend.key.width=unit(1,"cm"))+
labs(y = expression("viral encounters " ~day^-1~cell^-1), x = expression("dissipation rate "~(m^2~s^-3))) +
theme(legend.title = element_blank())

LS0tDQp0aXRsZTogImJldGEga2VybmVsIGZvciBwYXBlciINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNClRoaXMgaXMgYW4gW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIE5vdGVib29rLiBXaGVuIHlvdSBleGVjdXRlIGNvZGUgd2l0aGluIHRoZSBub3RlYm9vaywgdGhlIHJlc3VsdHMgYXBwZWFyIGJlbmVhdGggdGhlIGNvZGUuIA0KDQpUaGlzIHZlcnNpb24gb2YgYmV0YSBjYWxjdWxhdGlvbiBpcyB1c2VkIGZvciB0aGUgdGhlb3JldGljYWwgbWV0aG9kL3Jlc3VsdHMgb2YgdGhlIHBhcGVyLiBGb3IgcmVmZXJlbmNlOiB0aGUgbGFzdCB1cGRhdGUgd2FzIERlYyAyMDE4IGZvciBhbiBSIG5vdGVib29rLiBUaGlzIFIgbm90ZWJvb2sgaXMgYW4gdXBkYXRlZCBhbmQgbW9yZSBzb3BoaXN0aWNhdGVkIHZlcnNpb24uIA0KDQpDb25zdGFudHMgdXNlZCBhcmUgbGlzdGVkIGF0IHRoZSBzdGFydCBvZiB0aGlzIHNjcmlwdC4NCg0KYGBge3J9DQpzZXR3ZCgiRDovUiBwcm9ncmFtIikNCnNvdXJjZSgiaW5zcGFjay5SIikNCiN2YWx1ZXMgbmVlZGVkIA0KDQpLPSAxLjM4MDY0ODUyKigxMCleLTIzICNtMiBrZy8gczIgSyBib2x0em1hbm4gY29uc3RhbnQNCm11PSAxLjEyNiooMTApXi0zICNrZy9tIHMgZHluYW1pYyB2aXNjb3NpdHkgaW4gMThDDQp2PSAxLjA5OSooMTApXi02ICNtMi9zIGtpbmVtYXRpYyB2aXNjb3NpdHkgaW4gMThDDQpSZWhfY2FsYz0gMi4zRS02ICNpbiBtIHJhZGl1cyBFaHV4DQpSZWhfbmFrZWQ9IDEuOEUtNiAjaW4gbSByYWRpdXMgRWh1eA0KUmVoX2xpdGggPSAxLjNFLTYgI2luIG0gcmFkaXVzDQpSZWh2PSA5MCooMTApXi05ICNpbiBtIHJhZGl1cyB2aXJ1cw0KVGVtcCA9IDE4KzI3My4xNSAjdGVtcCBpbiBrZWx2aW4sIGhlcmUgYXNzdW1pbmcgMThDDQpEZW5fT2NNID0gMS4wNSAjZy9jbTMgZGVuc2l0eSBvcmdhbmljIGNlbGwgbWF0dGVyDQpEZW5fQ0gyTz0gMS4wMjUgI2cvY20zIGRlbnNpdHkgc2Vhd2F0ZXIgYXQgMThDDQpDY051bSA8LSAwLjkqKCgxMCleMykNCk5jTnVtIDwtIDAuMSooKDEwKV4zKQ0KVmlOdW0gPC0gKENjTnVtK05jTnVtKSoxMA0KTGlOdW0gPC0gQ2NOdW0qMTANCmBgYA0KDQpDYWxjdWxhdGluZyBmb3IgQnJvd25pYW4gbW90aW9uDQoNCmBgYHtyfQ0KI0Jyb3duaWFuIG1vdGlvbiAoQk0pDQojMS4gbWFrZSBhIGRhdGEgZnJhbWUNCkJNIDwtIGRhdGEuZnJhbWUgKGdyb3VwPWFzLmZhY3RvcihjKCJOYyIsICJDYyIsICJDYyIsICJMaSIsICJMaSIpKSwgZ3JvdXAyID1jKCJOYyIsICJDYy1NYyIsICJDYy1IYyIsICJMaS1NYyIsICJMaS1IYyIpLCByYWQ9IGMoUmVoX25ha2VkLCBSZWhfY2FsYywgUmVoX2NhbGMsIFJlaF9saXRoLCBSZWhfbGl0aCkpIA0KDQojMi4gY2FsY3VsYXRlIGJldGEgKGJldGEpDQpCTSRiZXRhX0JNIDwtICgoMiooSyooMTApXjQpKlRlbXAqKCgoQk0kcmFkK1JlaHYpKjEwMCleMikpLygoMyptdSoxMCkqKEJNJHJhZCpSZWh2KjFlNCkpKSo4NjQwMCAjY20zL2QNCg0KIyBnbyBiYWNrIHRvIHRoaXMgbGF0ZXINCiMzLiBjYWxjdWxhdGUgZW5jb3VudGVycyAoRSkNCiNCTSRFX0JNIDwtIEJNJGJldGFfQk0qVmlOdW0NCg0KQk0NCmBgYA0KDQpEaWZmZXJlbnRpYWwgc2V0dGxpbmcNCmBgYHtyfQ0KI0RpZmZlcmVudGlhbCBzZXR0bGluZyAoRFMpDQojMS4gcmVhZCBpbiBQSUMgZGF0YQ0KbGlicmFyeShyZWFkcikgI2Fsd2F5cyB1c2UgcmVhZHIgbm90IGJhc2VSDQoNCnNldHdkKCJEOi9SIHByb2dyYW0iKQ0KUElDIDwtIHJlYWRfY3N2KCJQb3N0ZG9jLVIvQ1NWIEZpbGVzL1BJQy5jc3YiKQ0KDQpQSUMkU3RyYWluIDwtIGFzLmZhY3RvcihQSUMkU3RyYWluKQ0KUElDJFJlcGxpY2F0ZSA8LSBhcy5mYWN0b3IoUElDJFJlcGxpY2F0ZSkNCg0KIzIuIGNhbGN1bGF0ZSBQSUMgZm9yIGNlbGwNClBJQyRQSUMgPC0gUElDJFRDLVBJQyRBQw0KUElDJFBJQ3BlcmNlbGwgPC0gKFBJQyRQSUMvUElDJENlbGxjb3VudCkqKDEwKV4tMyNpbiBnDQpQSUMkUElDcGVyY2VsbHBnIDwtIFBJQyRQSUNwZXJjZWxsKjFlMTINCg0KZ2dwbG90bHkoZ2dwbG90KGRhdGE9UElDLCBhZXMoeD1TdHJhaW4sIHk9UElDcGVyY2VsbHBnKSkgKyBnZW9tX2JveHBsb3QoKStnZW9tX3BvaW50KHNpemU9MikgK3RoZW1lX1B1YmxpY2F0aW9uKCkpDQoNCiMzYS4gY2FsY3VsYXRlIGRlbnNpdHkgb2YgY2VsbHMgKGRlbl9jZWxsKQ0KUElDIDwtIG11dGF0ZShQSUMsIGdyb3VwID0gaWZlbHNlKFBJQ3BlcmNlbGxwZyA8IDQgLCAiTmMiLCAiQ2MiKSkNCg0KZ2dwbG90bHkoZ2dwbG90KGRhdGE9UElDLCBhZXMoeD1ncm91cCwgeT1QSUNwZXJjZWxscGcpKSArIGdlb21fYm94cGxvdCgpK2dlb21fcG9pbnQoc2l6ZT0yLCBhZXMoY29sb3I9U3RyYWluKSkrIHRoZW1lX1B1YmxpY2F0aW9uKCkpDQoNClBJQyA8LSBtdXRhdGUoUElDLCByYWQgPSBpZmVsc2UoZ3JvdXAgPT0gIk5jIiAsIDEuOEUtNiwgIDIuM0UtNikpICNpbiBtDQoNClBJQyR2b2x1bWUgPC0gKDQvMykqcGkqKFBJQyRyYWQqMTAwKV4zICNpbiBjbTMNClBJQyREZW5fY2VsbCA8LSBQSUMkUElDcGVyY2VsbC9QSUMkdm9sdW1lICNnL2NtMw0KUElDJERlbl9jZWxsdG90YWwgPC0gUElDJERlbl9jZWxsK0Rlbl9PY00NCg0KI3JlbW92ZSBzdHJhaW5zIDYyMSwgNjIzLCA2MjUNClBJQyA8LSBQSUMgJT4lIGZpbHRlciAoISBTdHJhaW4gJWluJSBjKCI2MjEiLCAiNjIzIiwgIjY1NSIpKQ0KDQpnZ3Bsb3RseShnZ3Bsb3QoZGF0YT1QSUMsIGFlcyh4PVN0cmFpbiwgeT1EZW5fY2VsbHRvdGFsLCBjb2xvcj1ncm91cCkpICsgZ2VvbV9ib3hwbG90KCkrZ2VvbV9wb2ludChzaXplPTIpIA0KICAgICAgICAgK3RoZW1lX1B1YmxpY2F0aW9uKCkpDQojc29tZSBzdHJhaW5zIHRoYXQgYXJlICJuYWtlZCIgaGF2ZSBQSUM8Mi4gSSBjaG9zZSB0byBpZ25vcmUgdGhpcyBzaW5jZSBpbiB0aGUgbG0gbW9kZWwgSSBkbyBub3QgdXNlDQojc3RyYWluIGFzIGEgZmFjdG9yLCByYXRoZXIgZGF0YSBpcyB0cmVhdGVkIGFzIGEgd2hvbGUgKGUuZy4sIG5vIGdyb3VwaW5nKQ0KDQoNCmBgYA0KYGBge3J9DQojYXNzdW1lIGdyb3VwaW5nDQpQSUMkZ3JvdXAyIDwtIGNhc2Vfd2hlbigNCiAgUElDJFBJQ3BlcmNlbGxwZyA8MiAgfiAiTmMiLA0KICBQSUMkUElDcGVyY2VsbHBnID4yICYgUElDJFBJQ3BlcmNlbGxwZyA8IDQgfiAiTmMvQ2MgdW5jZXJ0YWluIiwNCiAgUElDJFBJQ3BlcmNlbGxwZyA+NCAmIFBJQyRQSUNwZXJjZWxscGcgPCAxMCB+ICJDYy1NYyIsDQogIFBJQyRQSUNwZXJjZWxscGcgPjEwIH4gIkNjLUhjIiwgDQogIFRSVUUgfiBhcy5jaGFyYWN0ZXIoUElDJFBJQ3BlcmNlbGxwZykNCikNCg0KUElDJGdyb3VwMiA8LSBmYWN0b3IgKFBJQyRncm91cDIsbGV2ZWxzPSBjKCJOYyIsICJOYy9DYyB1bmNlcnRhaW4iLCAiQ2MtTWMiLCAiQ2MtSGMiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSAgYygiTmMiLCAiTmMvQ2MgdW5jZXJ0YWluIiwgIkNjLU1jIiwgIkNjLUhjIikpDQoNCiNyZW1vdmUgTmMvQ2MgdW5jZXJ0YWluDQpQSUMgPC0gUElDICU+JSBmaWx0ZXIgKCEgZ3JvdXAyICVpbiUgYygiTmMvQ2MgdW5jZXJ0YWluIikpDQoNCg0KIzNiLiBjYWxjdWxhdGUgUElDIGFuZCBkZW5zaXR5IGZvciBsaXRoDQpQSUMkcGVybGl0aCA8LSBQSUMkUElDcGVyY2VsbC8xNCAjaW4gZywgYXNzdW1pbmcgMjAgbGl0aHMgYXR0YWNoZWQNClBJQyRwZXJsaXRocGcgPC0gUElDJHBlcmxpdGgqMWUxMiAjaW4gcGcNClBJQyREZW5saXRoIDwtIGNhc2Vfd2hlbigNCiAgUElDJGdyb3VwMiA9PSAiTmMiICB+IDEuMDI1LCANCiAgUElDJGdyb3VwMiA9PSAiQ2MtTWMiIH4gMiwNCiAgUElDJGdyb3VwMiA9PSAiQ2MtSGMiIH4gMi42KQ0KDQpnZ3Bsb3RseShnZ3Bsb3QoZGF0YT1QSUMsIGFlcyh4PWdyb3VwLCB5PURlbmxpdGgsIGNvbG9yPWdyb3VwKSkgKyBnZW9tX2JveHBsb3QoKStnZW9tX3BvaW50KHNpemU9MikgDQogICAgICAgICArdGhlbWVfUHVibGljYXRpb24oKSkNCg0KYGBgDQoNCmBgYHtyfQ0KIzQuIGNhbGN1bGF0ZSBzaW5raW5nIHZlbG9jaXR5IG9mIGNlbGxzLGxpdGhzLCBhbmQgdmlydXNlcw0KUElDJFNpbmtWZWwgPC0gKCgyKigoUElDJHJhZCoxMDApXjIpKig5ODEpKihQSUMkRGVuX2NlbGx0b3RhbC1EZW5fQ0gyTykpLyg5KihtdSoxMCkpKSo4NjQgI21ldGVyIHBlciBkYXkNClBJQyRTaW5rVmVsX2xpdGggPC0gKCgyKigoUmVoX2xpdGgqMTAwKV4yKSooOTgxKSooUElDJERlbmxpdGgtRGVuX0NIMk8pKS8oOSoobXUqMTApKSkqODY0ICNtZXRlciBwZXIgZGF5DQpFaHZfU2lua1ZlbCA8LSAoKDIqKChSZWh2KjEwMCleMikqKDk4MSkqKERlbl9DSDJPLURlbl9DSDJPKSkvKDkqKG11KjEwKSkpKjg2NCAgI2VxdWFscyB0byAwDQojZyBpcyBjb252ZXJ0ZWQgdG8gcGVyIGRheSwgODY0IGlzIHRoZSBvbmUgdGhhdCBjb252ZXJ0cyBjbS9zIHRvIG0vZGF5DQojcGxvdCBzaW5raW5nIHZlbG9jaXR5IHZzIGNhbGNpZmljYXRpb24NCg0KDQpnZ3Bsb3QoZGF0YT1QSUMsIGFlcyh4PVBJQ3BlcmNlbGxwZywgeT1TaW5rVmVsLCBjb2xvcj1TdHJhaW4sIHNoYXBlPWdyb3VwMikpICsgZ2VvbV9wb2ludChzaXplPTUpK3RoZW1lX1B1YmxpY2F0aW9uKCkrDQogICAgbGFicyh5ID0gZXhwcmVzc2lvbigiU2lua2luZyB2ZWxvY2l0eSJ+KCJtIn5kYXleLTEpKSwgeCA9IGV4cHJlc3Npb24oIlBJQyBwZyJ+Y2VsbF4tMSkpICsNCiAgICB0aGVtZShsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiLCBsZWdlbmQuYm94ID0gInZlcnRpY2FsIiwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSANCg0KZ2dwbG90KGRhdGE9UElDICU+JSBmaWx0ZXIgKGdyb3VwPT0iQ2MiKSwgYWVzKHg9cGVybGl0aHBnLCB5PVNpbmtWZWxfbGl0aCwgY29sb3I9Z3JvdXAyLCBzaGFwZT1ncm91cDIpKSArIA0KICBnZW9tX3BvaW50KHNpemU9NSkrdGhlbWVfUHVibGljYXRpb24oKSsNCiAgbGFicyh5ID0gZXhwcmVzc2lvbigiU2lua2luZyB2ZWxvY2l0eSJ+KCJtIn5kYXleLTEpKSwgeCA9IGV4cHJlc3Npb24oIlBJQyBwZyJ+bGl0aF4tMSkpICsNCiAgICB0aGVtZShsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiLCBsZWdlbmQuYm94ID0gInZlcnRpY2FsIiwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSANCg0KDQpgYGANCmBgYHtyfQ0KIzUuIGNhbGN1bGF0ZSBiZXRhcyBmb3IgRFMNClBJQyRiZXRhX0RTIDwtKHBpKigoKFBJQyRyYWQrUmVodikqMTAwKV4yKSooYWJzKChQSUMkU2lua1ZlbC1FaHZfU2lua1ZlbCkvODY0KSkpKjg2NDAwICNpbiBlbmNvdW50ZXJzIGNtMy9kYXkNClBJQyRiZXRhX0RTX2xpdGggPC0gKHBpKigoKFJlaF9saXRoK1JlaHYpKjEwMCleMikqKGFicygoUElDJFNpbmtWZWxfbGl0aC1FaHZfU2lua1ZlbCkvODY0KSkpKjg2NDAwICNpbiBlbmNvdW50ZXJzIGNtMy9kYXkNCg0KZ2dwbG90KGRhdGE9UElDLCBhZXMoeD1QSUNwZXJjZWxscGcsIHk9YmV0YV9EUywgY29sb3I9U3RyYWluLCAgc2hhcGU9Z3JvdXAyKSkgKyBnZW9tX3BvaW50KHNpemU9NSkrdGhlbWVfUHVibGljYXRpb24oKSsNCiAgbGFicyh5ID0gZXhwcmVzc2lvbihiZXRhfigiRW5jb3VudGVycyJ+Y21eM35kYXleLTEpKSwgeCA9IGV4cHJlc3Npb24oIlBJQyBwZyJ+Y2VsbF4tMSkpICArDQpzY2FsZV95X2xvZzEwKA0KICAgICAgICBicmVha3MgPSBzY2FsZXM6OnRyYW5zX2JyZWFrcygibG9nMTAiLCBmdW5jdGlvbih4KSAxMF54LCBuPTIpLA0KICAgICAgICBsYWJlbHMgPSBzY2FsZXM6OnRyYW5zX2Zvcm1hdCgibG9nMTAiLCBzY2FsZXM6Om1hdGhfZm9ybWF0KDEwXi54KSkpICsgYW5ub3RhdGlvbl9sb2d0aWNrcyhzaWRlcz0ibCIpKw0KICAgICAgdGhlbWUobGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgbGVnZW5kLmJveCA9ICJ2ZXJ0aWNhbCIsIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgDQoNCmdncGxvdChkYXRhPVBJQyAlPiUgZmlsdGVyIChncm91cD09IkNjIiksIGFlcyh4PXBlcmxpdGhwZywgeT1iZXRhX0RTX2xpdGgsIGNvbG9yPWdyb3VwMiwgc2hhcGU9Z3JvdXAyKSkgKyBnZW9tX3BvaW50KHNpemU9NSkrdGhlbWVfUHVibGljYXRpb24oKSsNCiAgbGFicyh5ID0gZXhwcmVzc2lvbihiZXRhfigiRW5jb3VudGVycyJ+Y21eM35kYXleLTEpKSwgeCA9IGV4cHJlc3Npb24oIlBJQyBwZyJ+bGl0aF4tMSkpICArDQpzY2FsZV95X2xvZzEwKA0KICAgICAgICBicmVha3MgPSBzY2FsZXM6OnRyYW5zX2JyZWFrcygibG9nMTAiLCBmdW5jdGlvbih4KSAxMF54LCBuPTIpLA0KICAgICAgICBsYWJlbHMgPSBzY2FsZXM6OnRyYW5zX2Zvcm1hdCgibG9nMTAiLCBzY2FsZXM6Om1hdGhfZm9ybWF0KDEwXi54KSkpICsgYW5ub3RhdGlvbl9sb2d0aWNrcyhzaWRlcz0ibCIpKw0KICAgICAgdGhlbWUobGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgbGVnZW5kLmJveCA9ICJ2ZXJ0aWNhbCIsIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgDQoNCmBgYA0KDQoNCmBgYHtyfQ0KIzYuIGNhbGN1bGF0ZSBlbmNvdW50ZXJzDQpQSUMkRV9EUyA8LSAoUElDJGJldGFfRFMqVmlOdW0pICNFIGNhbGN1bGF0ZWQgd2l0aCBWaXJ1cyBmb3IgY2VsbA0KUElDJEVfRFNfbGl0aCA8LSAoUElDJGJldGFfRFNfbGl0aCpWaU51bSkgI0UgY2FsY3VsYXRlZCB3aXRoIFZpcnVzIGZvciBsaXRoDQoNCmdncGxvdGx5KGdncGxvdChkYXRhPVBJQywgYWVzKHg9UElDcGVyY2VsbHBnLCB5PWxvZzEwKEVfRFMpKSkgK2dlb21fcG9pbnQoc2l6ZT01LCBhZXMoc2hhcGU9Z3JvdXAyLCBjb2xvcj1TdHJhaW4pKSArDQogICAgdGhlbWVfUHVibGljYXRpb24oKSArIGdlb21fc21vb3RoKCkpDQoNCmdncGxvdChkYXRhPVBJQywgYWVzKHg9UElDcGVyY2VsbHBnLCB5PUVfRFMsIGNvbG9yPVN0cmFpbiwgIHNoYXBlPWdyb3VwMikpICsgZ2VvbV9wb2ludChzaXplPTUpK3RoZW1lX1B1YmxpY2F0aW9uKCkrDQogIHNjYWxlX3lfbG9nMTAoDQogICAgICAgIGJyZWFrcyA9IHNjYWxlczo6dHJhbnNfYnJlYWtzKCJsb2cxMCIsIGZ1bmN0aW9uKHgpIDEwXngsIG49MiksDQogICAgICAgIGxhYmVscyA9IHNjYWxlczo6dHJhbnNfZm9ybWF0KCJsb2cxMCIsIHNjYWxlczo6bWF0aF9mb3JtYXQoMTBeLngpKSkgKyBhbm5vdGF0aW9uX2xvZ3RpY2tzKHNpZGVzPSJsIikgKw0KICAgICAgdGhlbWUobGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgbGVnZW5kLmJveCA9ICJ2ZXJ0aWNhbCIsIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBsYWJzKHkgPSBleHByZXNzaW9uKCJ2aXJhbCBlbmNvdW50ZXJzICIgfiBkYXleLTF+Y2VsbF4tMSksIHggPSBleHByZXNzaW9uKCJQSUMgcGcifmNlbGxeLTEpKQ0KDQpnZ3Bsb3QoZGF0YT1QSUMgJT4lIGZpbHRlciAoZ3JvdXAgPT0iQ2MiKSwgYWVzKHg9cGVybGl0aHBnLCB5PUVfRFNfbGl0aCwgY29sb3I9U3RyYWluLCAgc2hhcGU9Z3JvdXAyKSkgKyBnZW9tX3BvaW50KHNpemU9NSkrdGhlbWVfUHVibGljYXRpb24oKSsNCiAgc2NhbGVfeV9sb2cxMCgNCiAgICAgICAgYnJlYWtzID0gc2NhbGVzOjp0cmFuc19icmVha3MoImxvZzEwIiwgZnVuY3Rpb24oeCkgMTBeeCwgbj0yKSwNCiAgICAgICAgbGFiZWxzID0gc2NhbGVzOjp0cmFuc19mb3JtYXQoImxvZzEwIiwgc2NhbGVzOjptYXRoX2Zvcm1hdCgxMF4ueCkpKSArIGFubm90YXRpb25fbG9ndGlja3Moc2lkZXM9ImwiKSArDQogICAgICB0aGVtZShsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiLCBsZWdlbmQuYm94ID0gInZlcnRpY2FsIiwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArDQogIGxhYnMoeSA9IGV4cHJlc3Npb24oInZpcmFsIGVuY291bnRlcnMgIiB+IGRheV4tMX5jZWxsXi0xKSwgeCA9IGV4cHJlc3Npb24oIlBJQyBwZyJ+bGl0aF4tMSkpDQpgYGANCg0KYGBge3J9DQojNy4gc3VtbWFyaWVzDQpsaWJyYXJ5KHBseXIpDQpzdW1tYXJ5X0RTIDwtIGRkcGx5KFBJQywgLihTdHJhaW4pLCBzdW1tYXJpemUsICBQSUNwZXJjZWxscGc9bWVhbihQSUNwZXJjZWxscGcpLCBwZXJsaXRocGcgPSBtZWFuKHBlcmxpdGhwZyksIA0KICAgICAgICAgICAgICAgICAgICBEZW5fY2VsbHRvdGFsID0gbWVhbiAoRGVuX2NlbGx0b3RhbCksU2lua1ZlbD1tZWFuKFNpbmtWZWwpLGJldGFfRFM9bWVhbihiZXRhX0RTKSwgRV9EUz0gbWVhbihFX0RTKSwNCiAgICAgICAgICAgICAgICAgICAgRGVubGl0aCA9IG1lYW4gKERlbmxpdGgpLCBTaW5rVmVsX2xpdGg9bWVhbiAoU2lua1ZlbF9saXRoKSwgDQogICAgICAgICAgICAgICAgICAgIGJldGFfRFNfbGl0aD1tZWFuIChiZXRhX0RTX2xpdGgpLCBFX0RTX2xpdGg9bWVhbiAoRV9EU19saXRoKSkNCnN1bW1hcnlfRFNfYnlncm91cDIgPC0gZGRwbHkoUElDLCAuKGdyb3VwMiksIHN1bW1hcml6ZSwgIFBJQ3BlcmNlbGxwZz1tZWFuKFBJQ3BlcmNlbGxwZyksIHBlcmxpdGhwZyA9IG1lYW4ocGVybGl0aHBnKSwgDQogICAgICAgICAgICAgICAgICAgIERlbl9jZWxsdG90YWwgPSBtZWFuIChEZW5fY2VsbHRvdGFsKSwgU2lua1ZlbD1tZWFuKFNpbmtWZWwpLGJldGFfRFM9bWVhbihiZXRhX0RTKSwgRV9EUz0gbWVhbihFX0RTKSwNCiAgICAgICAgICAgICAgICAgICAgRGVubGl0aCA9IG1lYW4gKERlbmxpdGgpLCBTaW5rVmVsX2xpdGg9bWVhbiAoU2lua1ZlbF9saXRoKSwgDQogICAgICAgICAgICAgICAgICAgIGJldGFfRFNfbGl0aD1tZWFuIChiZXRhX0RTX2xpdGgpLCBFX0RTX2xpdGg9bWVhbiAoRV9EU19saXRoKSkNCg0Kc3VtbWFyeV9EU19ieWdyb3VwIDwtIGRkcGx5KFBJQywgLihncm91cCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcml6ZSwgIFBJQ3BlcmNlbGxwZz1tZWFuKFBJQ3BlcmNlbGxwZyksIHBlcmxpdGhwZyA9IG1lYW4ocGVybGl0aHBnKSwgDQogICAgICAgICAgICAgICAgICAgIERlbl9jZWxsdG90YWwgPSBtZWFuIChEZW5fY2VsbHRvdGFsKSwgU2lua1ZlbD1tZWFuKFNpbmtWZWwpLGJldGFfRFM9bWVhbihiZXRhX0RTKSwgRV9EUz0gbWVhbihFX0RTKSwNCiAgICAgICAgICAgICAgICAgICAgRGVubGl0aCA9IG1lYW4gKERlbmxpdGgpLCBTaW5rVmVsX2xpdGg9bWVhbiAoU2lua1ZlbF9saXRoKSwgDQogICAgICAgICAgICAgICAgICAgIGJldGFfRFNfbGl0aD1tZWFuIChiZXRhX0RTX2xpdGgpLCBFX0RTX2xpdGg9bWVhbiAoRV9EU19saXRoKSkNCnN1bW1hcnlfRFMNCnN1bW1hcnlfRFNfYnlncm91cDINCnN1bW1hcnlfRFNfYnlncm91cA0Kc2V0d2QoIkQ6L1IgcHJvZ3JhbSIpDQpyZXF1aXJlKG9wZW54bHN4KQ0Kd3JpdGUueGxzeChzdW1tYXJ5X0RTLCBmaWxlID0gIlBvc3Rkb2MtUi9FeHBvcnRlZCBUYWJsZXMvc3VtbWFyeV9EU19tYXN0ZXI0Lnhsc3giKQ0Kd3JpdGUueGxzeChzdW1tYXJ5X0RTX2J5Z3JvdXAsIGZpbGUgPSAiUG9zdGRvYy1SL0V4cG9ydGVkIFRhYmxlcy9zdW1tYXJ5X0RTX2J5Z3JvdXBfbWFzdGVyNC54bHN4IikNCndyaXRlLnhsc3goc3VtbWFyeV9EU19ieWdyb3VwMiwgZmlsZSA9ICJQb3N0ZG9jLVIvRXhwb3J0ZWQgVGFibGVzL3N1bW1hcnlfRFNfYnlncm91cDJfbWFzdGVyNC54bHN4IikNCmBgYA0KDQpgYGB7cn0NCiM4LiByZWdyZXNzaW9ucw0KIzhhLiBQSUMgYW5kIGJldGFfRFMgb2YgY2VsbHMgDQpQSUNfYmV0YV9yZWcgPC0gbG0gKGJldGFfRFMgfiBQSUNwZXJjZWxscGcsIGRhdGE9UElDKQ0Kc3VtbWFyeShQSUNfYmV0YV9yZWcpDQpwbG90KHJlc2lkdWFscy5sbShQSUNfYmV0YV9yZWcpKQ0KY29lZihQSUNfYmV0YV9yZWcpDQpjb3IoUElDJFBJQ3BlcmNlbGxwZywgUElDJGJldGFfRFMpDQoNCiM4ZCBvdGhlciByZWdyZXNzaW9ucywgY2hhbmdlIHRoaXMNClBJQ19EZW5fY2VsbHRvdGFsX3JlZyA8LSBsbShEZW5fY2VsbHRvdGFsIH4gUElDcGVyY2VsbHBnLCBkYXRhPVBJQykNClBJQ19TaW5rVmVsX3JlZyA8LSBsbSAoU2lua1ZlbCB+IFBJQ3BlcmNlbGxwZywgZGF0YT1QSUMpDQoNCnBsb3QocmVzaWR1YWxzLmxtKFBJQ19EZW5fY2VsbHRvdGFsX3JlZykpDQpwbG90KHJlc2lkdWFscy5sbShQSUNfU2lua1ZlbF9yZWcpKQ0KDQpgYGANCg0KYGBge3J9DQojOS4gbWFrZSBhIHByZWRpY3Rpb24gYmFzZWQgb24gUElDIHZhbHVlcw0KIzlhLiBmb3IgY2VsbHMNCnJlcXVpcmUodHJ1bmNub3JtKQ0KcmVxdWlyZShSbWlzYykNCnN1bW1hcnkoUElDJFBJQ3BlcmNlbGxwZykNCnN1bW1hcnlTRShkYXRhPVBJQywgbWVhc3VyZXZhcj0iUElDcGVyY2VsbHBnIikNCg0KI21ha2UgbmV3IGRhdGFmcmFtZQ0KUElDX25ld2RhdGEgPC0gYXMuZGF0YS5mcmFtZShydHJ1bmNub3JtKG49MTAwMDAsIGE9LTAuNCwgYj0yMC4xNCwgbWVhbj02LjA5LCBzZD02LjgzKSkNCiNyZW5hbWUgY29sdW1uLiByZW5hbWUgZnVuY3Rpb24gaW4gcGx5ciANCmxpYnJhcnkocGx5cikNClBJQ19uZXdkYXRhIDwtIHBseXI6OnJlbmFtZSAoUElDX25ld2RhdGEsIGMgKCJydHJ1bmNub3JtKG4gPSAxMDAwMCwgYSA9IC0wLjQsIGIgPSAyMC4xNCwgbWVhbiA9IDYuMDksIHNkID0gNi44MykiID0gIlBJQ3BlcmNlbGxwZyIpKQ0KUElDX25ld2RhdGEgPC0gbXV0YXRlKFBJQ19uZXdkYXRhLCBncm91cCA9IGlmZWxzZShQSUNwZXJjZWxscGcgPCA0ICwgIk5jIiwgIkNjIikpDQpnZ3Bsb3RseShnZ3Bsb3QoZGF0YT1QSUNfbmV3ZGF0YSwgYWVzKHg9Z3JvdXAsIHk9UElDcGVyY2VsbHBnKSkgKyBnZW9tX2JveHBsb3QoKStnZW9tX3BvaW50KHNpemU9MikgKw0KICAgICAgICAgICB0aGVtZV9QdWJsaWNhdGlvbigpKQ0KDQpgYGANCmBgYHtyfQ0KUElDX25ld2RhdGEkZ3JvdXAyIDwtIGNhc2Vfd2hlbigNCiAgUElDX25ld2RhdGEkUElDcGVyY2VsbHBnIDwyICB+ICJOYyIsDQogIFBJQ19uZXdkYXRhJFBJQ3BlcmNlbGxwZyA+MiAmIFBJQ19uZXdkYXRhJFBJQ3BlcmNlbGxwZyA8IDQgfiAiTmMvQ2MgdW5jZXJ0YWluIiwNCiAgUElDX25ld2RhdGEkUElDcGVyY2VsbHBnID40ICYgUElDX25ld2RhdGEkUElDcGVyY2VsbHBnIDwgMTAgfiAiQ2MtTWMiLA0KICBQSUNfbmV3ZGF0YSRQSUNwZXJjZWxscGcgPjEwIH4gIkNjLUhjIiwgDQogIFRSVUUgfiBhcy5jaGFyYWN0ZXIoUElDX25ld2RhdGEkUElDcGVyY2VsbHBnKQ0KKQ0KDQpQSUNfbmV3ZGF0YSRncm91cDIgPC0gZmFjdG9yIChQSUNfbmV3ZGF0YSRncm91cDIsbGV2ZWxzPSBjKCJOYyIsICJOYy9DYyB1bmNlcnRhaW4iLCAiQ2MtTWMiLCAiQ2MtSGMiKSwgbGFiZWxzID0gIGMoIk5jIiwgIk5jL0NjIHVuY2VydGFpbiIsICJDYy1NYyIsICJDYy1IYyIpKQ0KDQojcmVtb3ZlIE5jL0NjIHVuY2VydGFpbg0KUElDX25ld2RhdGEgPC0gUElDX25ld2RhdGEgJT4lIGZpbHRlciAoISBncm91cDIgJWluJSBjKCJOYy9DYyB1bmNlcnRhaW4iKSkNCg0KI2NhbGN1bGF0ZSBuZXcgc3R1ZmYNCg0KUElDX25ld2RhdGEgPC0gbXV0YXRlKFBJQ19uZXdkYXRhLCByYWQgPSBpZmVsc2UoZ3JvdXAgPT0gIk5jIiAsIDEuOEUtNiwgIDIuM0UtNikpICNpbiBtDQoNClBJQ19uZXdkYXRhJHZvbHVtZSA8LSAoNC8zKSpwaSooUElDX25ld2RhdGEkcmFkKjEwMCleMyAjaW4gY20zDQpQSUNfbmV3ZGF0YSREZW5fY2VsbCA8LSAoUElDX25ld2RhdGEkUElDcGVyY2VsbCoxZS0xMikvUElDX25ld2RhdGEkdm9sdW1lICNnL2NtMw0KUElDX25ld2RhdGEkRGVuX2NlbGx0b3RhbCA8LSBQSUNfbmV3ZGF0YSREZW5fY2VsbCtEZW5fT2NNDQoNCmdncGxvdGx5KGdncGxvdChkYXRhPVBJQywgYWVzKHg9U3RyYWluLCB5PURlbl9jZWxsdG90YWwsIGNvbG9yPWdyb3VwKSkgKyBnZW9tX2JveHBsb3QoKStnZW9tX3BvaW50KHNpemU9MikgDQogICAgICAgICArdGhlbWVfUHVibGljYXRpb24oKSkNCg0KDQojM2IuIGNhbGN1bGF0ZSBQSUMgYW5kIGRlbnNpdHkgZm9yIGxpdGgNClBJQ19uZXdkYXRhJHBlcmxpdGhwZyA8LSBQSUNfbmV3ZGF0YSRQSUNwZXJjZWxscGcvMTQgI2luIGcsIGFzc3VtaW5nIDIwIGxpdGhzIGF0dGFjaGVkDQpQSUNfbmV3ZGF0YSREZW5saXRoIDwtIGNhc2Vfd2hlbigNCiAgUElDX25ld2RhdGEkZ3JvdXAyID09ICJOYyIgIH4gMS4wMjUsIA0KICBQSUNfbmV3ZGF0YSRncm91cDIgPT0gIk5jL0NjIHVuY2VydGFpbiIgfiAxLjAyNSwNCiAgUElDX25ld2RhdGEkZ3JvdXAyID09ICJDYy1NYyIgfiAyLA0KICBQSUNfbmV3ZGF0YSRncm91cDIgPT0gIkNjLUhjIiB+IDIuNikNCg0KZ2dwbG90bHkoZ2dwbG90KGRhdGE9UElDX25ld2RhdGEsIGFlcyh4PWdyb3VwLCB5PURlbmxpdGgsIGNvbG9yPWdyb3VwKSkgKyBnZW9tX2JveHBsb3QoKStnZW9tX3BvaW50KHNpemU9MikgDQogICAgICAgICArdGhlbWVfUHVibGljYXRpb24oKSkNCg0KIzQuIGNhbGN1bGF0ZSBzaW5raW5nIHZlbG9jaXR5IG9mIGNlbGxzLGxpdGhzLCBhbmQgdmlydXNlcw0KUElDX25ld2RhdGEkU2lua1ZlbCA8LSAoKDIqKChQSUNfbmV3ZGF0YSRyYWQqMTAwKV4yKSooOTgxKSooUElDX25ld2RhdGEkRGVuX2NlbGx0b3RhbC1EZW5fQ0gyTykpLyg5KihtdSoxMCkpKSo4NjQgI21ldGVyIHBlciBkYXkNClBJQ19uZXdkYXRhJFNpbmtWZWxfbGl0aCA8LSAoKDIqKChSZWhfbGl0aCoxMDApXjIpKig5ODEpKihQSUNfbmV3ZGF0YSREZW5saXRoLURlbl9DSDJPKSkvKDkqKG11KjEwKSkpKjg2NCAjbWV0ZXIgcGVyIGRheQ0KRWh2X1NpbmtWZWwgPC0gKCgyKigoUmVodioxMDApXjIpKig5ODEpKihEZW5fQ0gyTy1EZW5fQ0gyTykpLyg5KihtdSoxMCkpKSo4NjQgICNlcXVhbHMgdG8gMA0KI2cgaXMgY29udmVydGVkIHRvIHBlciBkYXksIDg2NCBpcyB0aGUgb25lIHRoYXQgY29udmVydHMgY20vcyB0byBtL2RheQ0KI3Bsb3Qgc2lua2luZyB2ZWxvY2l0eSB2cyBjYWxjaWZpY2F0aW9uDQoNCg0KZ2dwbG90KGRhdGE9UElDX25ld2RhdGEsIGFlcyh4PVBJQ3BlcmNlbGxwZywgeT1TaW5rVmVsLCBjb2xvcj1ncm91cDIsIHNoYXBlPWdyb3VwMikpICsgZ2VvbV9wb2ludChzaXplPTUpK3RoZW1lX1B1YmxpY2F0aW9uKCkrDQogICAgbGFicyh5ID0gZXhwcmVzc2lvbigiU2lua2luZyB2ZWxvY2l0eSJ+KCJtIn5kYXleLTEpKSwgeCA9IGV4cHJlc3Npb24oIlBJQyBwZyJ+Y2VsbF4tMSkpICsNCiAgICB0aGVtZShsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiLCBsZWdlbmQuYm94ID0gInZlcnRpY2FsIiwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSANCg0KZ2dwbG90KGRhdGE9UElDX25ld2RhdGEgJT4lIGZpbHRlciAoZ3JvdXA9PSJDYyIpLCBhZXMoeD1wZXJsaXRocGcsIHk9U2lua1ZlbF9saXRoLCBjb2xvcj1ncm91cDIsIHNoYXBlPWdyb3VwMikpICsgDQogIGdlb21fcG9pbnQoc2l6ZT01KSt0aGVtZV9QdWJsaWNhdGlvbigpKw0KICBsYWJzKHkgPSBleHByZXNzaW9uKCJTaW5raW5nIHZlbG9jaXR5In4oIm0ifmRheV4tMSkpLCB4ID0gZXhwcmVzc2lvbigiUElDIHBnIn5saXRoXi0xKSkgKw0KICAgIHRoZW1lKGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIGxlZ2VuZC5ib3ggPSAidmVydGljYWwiLCBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpIA0KDQoNCg0KYGBgDQpgYGB7cn0NCg0KIzUuIGNhbGN1bGF0ZSBiZXRhcyBmb3IgRFMNClBJQ19uZXdkYXRhJGJldGFfRFMgPC0ocGkqKCgoUElDX25ld2RhdGEkcmFkK1JlaHYpKjEwMCleMikqKGFicygoUElDX25ld2RhdGEkU2lua1ZlbC1FaHZfU2lua1ZlbCkvODY0KSkpKjg2NDAwICNpbiBlbmNvdW50ZXJzIGNtMy9kYXkNClBJQ19uZXdkYXRhJGJldGFfRFNfbGl0aCA8LSAocGkqKCgoUmVoX2xpdGgrUmVodikqMTAwKV4yKSooYWJzKChQSUNfbmV3ZGF0YSRTaW5rVmVsX2xpdGgtRWh2X1NpbmtWZWwpLzg2NCkpKSo4NjQwMCAjaW4gZW5jb3VudGVycyBjbTMvZGF5DQoNCmdncGxvdChkYXRhPVBJQ19uZXdkYXRhICU+JSBmaWx0ZXIgKCEoZ3JvdXAyICVpbiUgYygiTmMvQ2MgdW5jZXJ0YWluIikpKSwgYWVzKHg9UElDcGVyY2VsbHBnICwgeT1iZXRhX0RTLCBjb2xvcj1ncm91cDIsICBzaGFwZT1ncm91cDIpKSArIGdlb21fcG9pbnQoc2l6ZT01KSt0aGVtZV9QdWJsaWNhdGlvbigpKw0KICBsYWJzKHkgPSBleHByZXNzaW9uKGJldGF+KCJFbmNvdW50ZXJzIn5jbV4zfmRheV4tMSkpLCB4ID0gZXhwcmVzc2lvbigiUElDIHBnIn5jZWxsXi0xKSkgICsNCnNjYWxlX3lfbG9nMTAoDQogICAgICAgIGJyZWFrcyA9IHNjYWxlczo6dHJhbnNfYnJlYWtzKCJsb2cxMCIsIGZ1bmN0aW9uKHgpIDEwXngsIG49MiksDQogICAgICAgIGxhYmVscyA9IHNjYWxlczo6dHJhbnNfZm9ybWF0KCJsb2cxMCIsIHNjYWxlczo6bWF0aF9mb3JtYXQoMTBeLngpKSkgKyBhbm5vdGF0aW9uX2xvZ3RpY2tzKHNpZGVzPSJsIikrDQogICAgICB0aGVtZShsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiLCBsZWdlbmQuYm94ID0gInZlcnRpY2FsIiwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSANCg0KZ2dwbG90KGRhdGE9UElDX25ld2RhdGEgJT4lIGZpbHRlciAoZ3JvdXA9PSJDYyIpLCBhZXMoeD1wZXJsaXRocGcsIHk9YmV0YV9EU19saXRoLCBjb2xvcj1ncm91cDIsIHNoYXBlPWdyb3VwMikpICsgZ2VvbV9wb2ludChzaXplPTUpK3RoZW1lX1B1YmxpY2F0aW9uKCkrDQogIGxhYnMoeSA9IGV4cHJlc3Npb24oYmV0YX4oIkVuY291bnRlcnMifmNtXjN+ZGF5Xi0xKSksIHggPSBleHByZXNzaW9uKCJQSUMgcGcifmxpdGheLTEpKSAgKw0Kc2NhbGVfeV9sb2cxMCgNCiAgICAgICAgYnJlYWtzID0gc2NhbGVzOjp0cmFuc19icmVha3MoImxvZzEwIiwgZnVuY3Rpb24oeCkgMTBeeCwgbj0yKSwNCiAgICAgICAgbGFiZWxzID0gc2NhbGVzOjp0cmFuc19mb3JtYXQoImxvZzEwIiwgc2NhbGVzOjptYXRoX2Zvcm1hdCgxMF4ueCkpKSArIGFubm90YXRpb25fbG9ndGlja3Moc2lkZXM9ImwiKSsNCiAgICAgIHRoZW1lKGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIGxlZ2VuZC5ib3ggPSAidmVydGljYWwiLCBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpIA0KCSAgDQojNi4gY2FsY3VsYXRlIGVuY291bnRlcnMNClBJQ19uZXdkYXRhJEVfRFMgPC0gKFBJQ19uZXdkYXRhJGJldGFfRFMqVmlOdW0pICNFIGNhbGN1bGF0ZWQgd2l0aCBWaXJ1cyBmb3IgY2VsbA0KUElDX25ld2RhdGEkRV9EU19saXRoIDwtIChQSUNfbmV3ZGF0YSRiZXRhX0RTX2xpdGgqVmlOdW0pICNFIGNhbGN1bGF0ZWQgd2l0aCBWaXJ1cyBmb3IgbGl0aA0KDQpnZ3Bsb3RseShnZ3Bsb3QoZGF0YT1QSUNfbmV3ZGF0YSwgYWVzKHg9UElDcGVyY2VsbHBnLCB5PWxvZzEwKEVfRFMpKSkgK2dlb21fcG9pbnQoc2l6ZT01LCBhZXMoc2hhcGU9Z3JvdXAyLCBjb2xvcj1ncm91cDIpKSArDQogICAgdGhlbWVfUHVibGljYXRpb24oKSArIGdlb21fc21vb3RoKCkpDQojcmVtb3ZlIHN0cmFpbnMgNjIxLCA2MjMsIDYyNQ0KDQpnZ3Bsb3QoZGF0YT1QSUNfbmV3ZGF0YSAsIGFlcyh4PVBJQ3BlcmNlbGxwZywgeT1FX0RTLCBjb2xvcj1ncm91cDIsICBzaGFwZT1ncm91cDIpKSArIGdlb21fcG9pbnQoc2l6ZT01KSt0aGVtZV9QdWJsaWNhdGlvbigpKw0KICBzY2FsZV95X2xvZzEwKA0KICAgICAgICBicmVha3MgPSBzY2FsZXM6OnRyYW5zX2JyZWFrcygibG9nMTAiLCBmdW5jdGlvbih4KSAxMF54LCBuPTIpLA0KICAgICAgICBsYWJlbHMgPSBzY2FsZXM6OnRyYW5zX2Zvcm1hdCgibG9nMTAiLCBzY2FsZXM6Om1hdGhfZm9ybWF0KDEwXi54KSkpICsgYW5ub3RhdGlvbl9sb2d0aWNrcyhzaWRlcz0ibCIpICsNCiAgICAgIHRoZW1lKGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIGxlZ2VuZC5ib3ggPSAidmVydGljYWwiLCBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgbGFicyh5ID0gZXhwcmVzc2lvbigidmlyYWwgZW5jb3VudGVycyAiIH4gZGF5Xi0xfmNlbGxeLTEpLCB4ID0gZXhwcmVzc2lvbigiUElDIHBnIn5jZWxsXi0xKSkNCg0KZ2dwbG90KGRhdGE9UElDX25ld2RhdGEgJT4lIGZpbHRlciAoZ3JvdXAgPT0iQ2MiKSwgYWVzKHg9cGVybGl0aHBnLCB5PUVfRFNfbGl0aCwgY29sb3I9Z3JvdXAyLCAgc2hhcGU9Z3JvdXAyKSkgKyBnZW9tX3BvaW50KHNpemU9NSkrdGhlbWVfUHVibGljYXRpb24oKSsNCiAgc2NhbGVfeV9sb2cxMCgNCiAgICAgICAgYnJlYWtzID0gc2NhbGVzOjp0cmFuc19icmVha3MoImxvZzEwIiwgZnVuY3Rpb24oeCkgMTBeeCwgbj0yKSwNCiAgICAgICAgbGFiZWxzID0gc2NhbGVzOjp0cmFuc19mb3JtYXQoImxvZzEwIiwgc2NhbGVzOjptYXRoX2Zvcm1hdCgxMF4ueCkpKSArIGFubm90YXRpb25fbG9ndGlja3Moc2lkZXM9ImwiKSArDQogICAgICB0aGVtZShsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiLCBsZWdlbmQuYm94ID0gInZlcnRpY2FsIiwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArDQogIGxhYnMoeSA9IGV4cHJlc3Npb24oInZpcmFsIGVuY291bnRlcnMgIiB+IGRheV4tMX5jZWxsXi0xKSwgeCA9IGV4cHJlc3Npb24oIlBJQyBwZyJ+bGl0aF4tMSkpDQpgYGANCg0KYGBge3J9DQojMTAuIGNhbGN1bGF0ZSBlbmNvdW50ZXJzIGJhc2VkIG9uIG5ld2RhdGENCg0Kc3VtbWFyeV9EU19ieWdyb3VwPC1kZHBseShQSUMgJT4lIGZpbHRlciAoIShncm91cDIgJWluJSBjKCJuYWtlZC9jYWxjaWZpZWQgdW5jZXJ0YWluIikpKSwgLihncm91cCksIHN1bW1hcml6ZSwgIFBJQ3BlcmNlbGxwZz1tZWFuKFBJQ3BlcmNlbGxwZyksIA0KICAgICAgICAgICAgICAgICAgICBwZXJsaXRocGcgPSBtZWFuKHBlcmxpdGhwZyksIERlbl9jZWxsdG90YWwgPSBtZWFuIChEZW5fY2VsbHRvdGFsKSwNCiAgICAgICAgICAgICAgICAgICAgU2lua1ZlbD1tZWFuKFNpbmtWZWwpLGJldGFfRFM9bWVhbihiZXRhX0RTKSwgRV9EUz0gbWVhbihFX0RTKSwgDQogICAgICAgICAgICAgICAgICAgIERlbmxpdGggPSBtZWFuIChEZW5saXRoKSwgU2lua1ZlbF9saXRoPW1lYW4gKFNpbmtWZWxfbGl0aCksIA0KICAgICAgICAgICAgICAgICAgICBiZXRhX0RTX2xpdGg9bWVhbiAoYmV0YV9EU19saXRoKSwgRV9EU19saXRoPW1lYW4gKEVfRFNfbGl0aCkpDQpzdW1tYXJ5X0RTX2J5Z3JvdXANCg0KI3JlbW92ZSBuYWtlZC9jYWxjaWZpZWQgdW5jZXJ0YWluDQoNCnN1bW1hcnlfRFNfYnlncm91cF9wcmVkIDwtZGRwbHkoUElDX25ld2RhdGEsIC4oZ3JvdXApLCBzdW1tYXJpemUsICBQSUNwZXJjZWxscGc9bWVhbihQSUNwZXJjZWxscGcpLCANCiAgICAgICAgICAgICAgICAgICAgcGVybGl0aHBnID0gbWVhbihwZXJsaXRocGcpLCBEZW5fY2VsbHRvdGFsID0gbWVhbiAoRGVuX2NlbGx0b3RhbCksDQogICAgICAgICAgICAgICAgICAgIFNpbmtWZWw9bWVhbihTaW5rVmVsKSxiZXRhX0RTPW1lYW4oYmV0YV9EUyksIEVfRFM9IG1lYW4oRV9EUyksIA0KICAgICAgICAgICAgICAgICAgICBEZW5saXRoID0gbWVhbiAoRGVubGl0aCksIFNpbmtWZWxfbGl0aD1tZWFuIChTaW5rVmVsX2xpdGgpLCANCiAgICAgICAgICAgICAgICAgICAgYmV0YV9EU19saXRoPW1lYW4gKGJldGFfRFNfbGl0aCksIEVfRFNfbGl0aD1tZWFuIChFX0RTX2xpdGgpKQ0Kc3VtbWFyeV9EU19ieWdyb3VwX3ByZWQNCg0Kc3VtbWFyeV9EU19ieWdyb3VwMl9wcmVkIDwtZGRwbHkoUElDX25ld2RhdGEsIC4oZ3JvdXAyKSwgc3VtbWFyaXplLCAgUElDcGVyY2VsbHBnPW1lYW4oUElDcGVyY2VsbHBnKSwgDQogICAgICAgICAgICAgICAgICAgIHBlcmxpdGhwZyA9IG1lYW4ocGVybGl0aHBnKSwgRGVuX2NlbGx0b3RhbCA9IG1lYW4gKERlbl9jZWxsdG90YWwpLA0KICAgICAgICAgICAgICAgICAgICBTaW5rVmVsPW1lYW4oU2lua1ZlbCksYmV0YV9EUz1tZWFuKGJldGFfRFMpLCBFX0RTPSBtZWFuKEVfRFMpLCANCiAgICAgICAgICAgICAgICAgICAgRGVubGl0aCA9IG1lYW4gKERlbmxpdGgpLCBTaW5rVmVsX2xpdGg9bWVhbiAoU2lua1ZlbF9saXRoKSwgDQogICAgICAgICAgICAgICAgICAgIGJldGFfRFNfbGl0aD1tZWFuIChiZXRhX0RTX2xpdGgpLCBFX0RTX2xpdGg9bWVhbiAoRV9EU19saXRoKSkNCnN1bW1hcnlfRFNfYnlncm91cDJfcHJlZA0KDQpzdW1tYXJ5U0UgKFBJQ19uZXdkYXRhICU+JSBmaWx0ZXIgKCEoZ3JvdXAyICVpbiUgYygibmFrZWQvY2FsY2lmaWVkIHVuY2VydGFpbiIpKSksIA0KICAgICAgICAgICBtZWFzdXJldmFyID0gIlBJQ3BlcmNlbGxwZyIsIGdyb3VwdmFycyA9IGMoImdyb3VwIikpDQoNCg0Kc2V0d2QoIkQ6L1IgcHJvZ3JhbSIpDQp3cml0ZS54bHN4KHN1bW1hcnlfRFNfYnlncm91cF9wcmVkLCBmaWxlID0gIlBvc3Rkb2MtUi9FeHBvcnRlZCBUYWJsZXMvc3VtbWFyeV9EU19ieWdyb3VwX3ByZWRfbWFzdGVyNC54bHN4IikNCmBgYA0KDQpgYGB7cn0NCiNhcnJhbmdlIHRoZSBzdW1tYXJ5DQpEU19wcmVkIDwtIGRhdGEuZnJhbWUgKGdyb3VwPWFzLmZhY3RvcihjKCJOYyIsICJDYyIsICJDYyIsICJMaSIsICJMaSIpKSwgZ3JvdXAyID1jKCJOYyIsICJDYy1NYyIsICJDYy1IYyIsICJMaS1NYyIsICJMaS1IYyIpLCBQSUMgPSBjKDAuODc2NzI1MywgNi45NDgyNDcxLCAxMy42NDExODE4LCAwLjQ5NjMwMzM2LCAwLjk3NDM3MDEzKSwgRGVuID0gYygxLjA4NTg4OSwgMS4xODYzMzQsIDEuMzE3NjU4LCAyLCAyLjYpLCBTaW5rVmVsID0gYygwLjAzMjk5OTk2LDAuMTQyNzYxOTcsIDAuMjU4OTY4ODksIDAuMjc1NjI3OSwgMC40NDUyNDUxKSwgYmV0YV9EUyA9IGMoMy43MDMyODNlLTA3LCAyLjU2MTg3N2UtMDYsIDQuNjQ3MjIwZS0wNiwgMS42NzMwMjZlLTA2LCAyLjcwMjU4MGUtMDYpKQ0KDQpEU19wcmVkDQpgYGANCg0KVHVyYnVsZW5jZQ0KYGBge3J9DQojVHVyYnVsZW5jZQ0KIzEuIG1ha2UgbmV3IGRhdGFmcmFtZQ0KI2Rpc3JhdGUgaXMgY20yL3MzDQojbWFrZSBkYXRhIGZyYW1lDQp0dXJiIDwtIGV4cGFuZC5ncmlkKGxpc3QgKGRpc3JhdGUgPSAoYyAoMSAlbyUgMTBeKHNlcSgtOCwtMiwgMC41KSkpKSwgZ3JvdXAyID1jKCJOYyIsICJDYy1NYyIsICJDYy1IYyIsICJMaS1NYyIsICJMaS1IYyIpKSkNCnR1cmIkZ3JvdXAgPC0gZmFjdG9yICh0dXJiJGdyb3VwLGxldmVscz0gYygiTmMiLCAiQ2MtTWMiLCAiQ2MtSGMiLCAiTGktTWMiLCAiTGktSGMiKSwgbGFiZWxzID0gYygiTmMiLCAiQ2MiLCAiQ2MiLCAiTGkiLCAiTGkiKSkNCg0KdHVyYiRyYWQgPC0gY2FzZV93aGVuKA0KICAgIHR1cmIkZ3JvdXAgPT0iTmMiIH4gMS44RS02LA0KICAgIHR1cmIkZ3JvdXAgPT0iQ2MiIH4gMi4zRS02LA0KICAgIHR1cmIkZ3JvdXAgPT0iTGkiIH4gMS4zRS02LA0KICAgIFRSVUUgfiBhcy5udW1lcmljKHR1cmIkZ3JvdXApDQopDQp0dXJiJGRpc3JhdGUgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHVyYiRkaXNyYXRlKSkNCg0KIzIuIGNhbGN1bGF0ZSBiZXRhIGFuZCBlbmNvdW50ZXJzDQp0dXJiJGJldGFfdHVyYiA8LSAoNC4yKnBpKigodHVyYiRkaXNyYXRlLyh2KjEwMF4yKSleMC41KSooKCh0dXJiJHJhZCtSZWh2KSoxMDApXjMpKSo4NjQwMCANCnR1cmIkRV90dXJiIDwtICh0dXJiJGJldGFfdHVyYipWaU51bSkgI0UgY2FsY3VsYXRlZCB3aXRoIHZpcnVzIG9ubHkNCg0KdHVyYiRncm91cCA8LSBmYWN0b3IgKHR1cmIkZ3JvdXAsbGV2ZWxzPSBjKCJOYyIsICJDYyIsICJMaSIpLCBsYWJlbHMgPSBjKCJOYyIsICJDYyIsICJMaSIpKQ0KDQpnZ3Bsb3QoZGF0YSA9IHR1cmIsIGFlcyh4ID0gZGlzcmF0ZSwgeSA9IGJldGFfdHVyYiwgY29sb3I9Z3JvdXApKSArIGdlb21fcG9pbnQoc2l6ZSA9NSkgKw0KICBzY2FsZV95X2xvZzEwKA0KICAgICAgICBicmVha3MgPSBzY2FsZXM6OnRyYW5zX2JyZWFrcygibG9nMTAiLCBmdW5jdGlvbih4KSAxMF54LCBuPTQpLA0KICAgICAgICBsYWJlbHMgPSBzY2FsZXM6OnRyYW5zX2Zvcm1hdCgibG9nMTAiLCBzY2FsZXM6Om1hdGhfZm9ybWF0KDEwXi54KSkpICsNCiAgc2NhbGVfeF9sb2cxMCgNCiAgICAgICAgYnJlYWtzID0gc2NhbGVzOjp0cmFuc19icmVha3MoImxvZzEwIiwgZnVuY3Rpb24oeCkgMTBeeCwgbj00KSwNCiAgICAgICAgbGFiZWxzID0gc2NhbGVzOjp0cmFuc19mb3JtYXQoImxvZzEwIiwgc2NhbGVzOjptYXRoX2Zvcm1hdCgxMF4ueCkpKSArDQogIGFubm90YXRpb25fbG9ndGlja3MoKSArDQogIHRoZW1lX1B1YmxpY2F0aW9uKCkgKw0KICBsYWJzKHkgPSBleHByZXNzaW9uKGJldGF+KCJwcmVkaWN0ZWQgZW5jb3VudGVycyAiIH5jbV4zfmRheV4tMSkpLCANCiAgICAgICB4ID0gZXhwcmVzc2lvbigiZGlzc2lwYXRpb24gcmF0ZSAifihtXjJ+c14tMykpKSArDQogICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpDQoNCmdncGxvdChkYXRhID0gdHVyYiwgYWVzKHggPSBkaXNyYXRlLCB5ID0gRV90dXJiLCBjb2xvcj1ncm91cCkpICsgZ2VvbV9wb2ludChzaXplID01KSArDQogICBzY2FsZV95X2xvZzEwKA0KICAgICAgICBicmVha3MgPSBzY2FsZXM6OnRyYW5zX2JyZWFrcygibG9nMTAiLCBmdW5jdGlvbih4KSAxMF54LCBuPTQpLA0KICAgICAgICBsYWJlbHMgPSBzY2FsZXM6OnRyYW5zX2Zvcm1hdCgibG9nMTAiLCBzY2FsZXM6Om1hdGhfZm9ybWF0KDEwXi54KSkpICsNCiAgc2NhbGVfeF9sb2cxMCgNCiAgICAgICAgYnJlYWtzID0gc2NhbGVzOjp0cmFuc19icmVha3MoImxvZzEwIiwgZnVuY3Rpb24oeCkgMTBeeCwgbj03KSwNCiAgICAgICAgbGFiZWxzID0gc2NhbGVzOjp0cmFuc19mb3JtYXQoImxvZzEwIiwgc2NhbGVzOjptYXRoX2Zvcm1hdCgxMF4ueCkpKSArDQogIGFubm90YXRpb25fbG9ndGlja3MoKSsNCiAgdGhlbWVfUHVibGljYXRpb24oKSsNCiAgbGFicyh5ID0gZXhwcmVzc2lvbigidmlyYWwgZW5jb3VudGVycyAiIH4gY21eLTN+ZGF5Xi0xKSx4ID0gZXhwcmVzc2lvbigiZGlzc2lwYXRpb24gcmF0ZSAifihtXjJ+c14tMykpKSArDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkNCmBgYA0KDQptZWx0IGFsbCBkYXRhIGFuZCBtYWtlIGEgdGFibGUgd2l0aCBhbGwNCmBgYHtyfQ0KYWxsIDwtIFJlZHVjZShmdW5jdGlvbih4LHkpIG1lcmdlKHgseSxieT0iZ3JvdXAyIixhbGw9VFJVRSkgLA0KICAgICAgICAgICAgICBsaXN0KEJNICU+JSBzZWxlY3QgKGdyb3VwMiwgYmV0YV9CTSksIERTX3ByZWQgJT4lIHNlbGVjdCAoZ3JvdXAyLCBiZXRhX0RTKSwgDQogICAgICAgICAgICAgICAgICAgdHVyYiAlPiUgc2VsZWN0IChncm91cDIsIGRpc3JhdGUsIGJldGFfdHVyYikpKQ0KYWxsJGJldGFfYWxsIDwtIGFsbCRiZXRhX0JNICsgYWxsJGJldGFfRFMgKyBhbGwkYmV0YV90dXJiDQphbGwkRV9hbGxfbG93IDwtIGFsbCRiZXRhX2FsbCooMTBeNCkNCmFsbCRFX2FsbF9oaWdoIDwtIGFsbCRiZXRhX2FsbCooMTBeNikNCmFsbCRncm91cCA8LSBmYWN0b3IgKGFsbCRncm91cCxsZXZlbHM9IGMoIk5jIiwgIkNjLU1jIiwgIkNjLUhjIiwgIkxpLU1jIiwgIkxpLUhjIiksIGxhYmVscyA9IGMoIk5jIiwgIkNjIiwgIkNjIiwgIkxpIiwgIkxpIikpDQoNCiNtYWtlIHN1bW1hcnkgc28gdGhhdCB5b3UgY2FuIGhhdmUgQ0kNCg0KDQojcGxvdHRpbmcNCmdncGxvdChkYXRhPWFsbCwgYWVzKHg9ZGlzcmF0ZSx5ID0gRV9hbGxfbG93ICwgY29sb3I9Z3JvdXAsIGZpbGw9Z3JvdXApKSArIA0KICAgIGdlb21fc21vb3RoKHNpemU9MSwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKHc9MC4wMiwgaD0wKSwgYWVzKGxpbmV0eXBlPSIxMF4zIiwgZmlsbD1ncm91cCkpKw0KICAgIGdlb21fc21vb3RoKGRhdGEgPSBhbGwsIGFlcyh5PSBFX2FsbF9oaWdoLCBjb2xvcj1ncm91cCxmaWxsPWdyb3VwLCBsaW5ldHlwZT0iMTBeNSIpKSArDQogICAgc2NhbGVfeV9sb2cxMCgNCiAgICAgICAgYnJlYWtzID0gc2NhbGVzOjp0cmFuc19icmVha3MoImxvZzEwIiwgZnVuY3Rpb24oeCkgMTBeeCwgbj0yKSwNCiAgICAgICAgbGFiZWxzID0gc2NhbGVzOjp0cmFuc19mb3JtYXQoImxvZzEwIiwgc2NhbGVzOjptYXRoX2Zvcm1hdCgxMF4ueCkpKSArDQogICAgc2NhbGVfeF9sb2cxMCgNCiAgICAgICAgYnJlYWtzID0gc2NhbGVzOjp0cmFuc19icmVha3MoImxvZzEwIiwgZnVuY3Rpb24oeCkgMTBeeCwgbj03KSwNCiAgICAgICAgbGFiZWxzID0gc2NhbGVzOjp0cmFuc19mb3JtYXQoImxvZzEwIiwgc2NhbGVzOjptYXRoX2Zvcm1hdCgxMF4ueCkpKSArDQogICAgYW5ub3RhdGlvbl9sb2d0aWNrcygpKw0KICAgIHRoZW1lX1B1YmxpY2F0aW9uKCkgKw0KICAgIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLmtleS53aWR0aD11bml0KDEsImNtIikpKw0KICAgIGxhYnMoeSA9IGV4cHJlc3Npb24oInZpcmFsIGVuY291bnRlcnMgIiB+ZGF5Xi0xfmNlbGxeLTEpLCB4ID0gZXhwcmVzc2lvbigiZGlzc2lwYXRpb24gcmF0ZSAifihtXjJ+c14tMykpKSArDQogICAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQ0KYGBgDQoNCg==